package gitlet;

import java.io.IOException;
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.Queue;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

/**
 * @author 陈恒康
 * @Description Tools_DataRedirection类是OutputStream的子类，用于创建一个输出重定向工具。这个工具可以将输出重定向到一个指定的文本区域。
 * @date 2023/12/15
 */
public class Tools_DataRedirection extends OutputStream {
    private final JTextArea destination;
    private final Queue<String> lines = new LinkedList<>();

    /**
     * @param destination 输出的目标文本区域
     * @Description 构造一个新的Tools_DataRedirection对象。该对象将输出重定向到指定的文本区域。
     * @author 陈恒康
     * @date 2023/12/15
     */
    public Tools_DataRedirection(JTextArea destination) {
        if (destination == null)
            throw new IllegalArgumentException("Destination is null");
        this.destination = destination;
    }

    /**
     * @param buffer 要写入的数据
     * @param offset 开始写入数据的起始偏移量
     * @param length 要写入的字节数
     * @throws IOException 如果发生I/O错误
     * @Description 将指定的字节数组的一部分写入此输出流。然后将这些字节添加到队列中，并设置文本区域的文本为队列中的所有字符串。
     * @author 陈恒康
     * @date 2023/12/15
     */
    @Override
    public void write(byte[] buffer, int offset, int length) throws IOException {
        final String text = new String(buffer, offset, length);
        SwingUtilities.invokeLater(() -> {
            lines.add(text);
            destination.setText(String.join("\n", lines));
        });
    }

    @Override
    public void write(int b) throws IOException {
        write(new byte[]{(byte) b}, 0, 1);
    }
}